package LeetCode;

/**
 * @author VX5
 * @Title: MJC
 * @ProjectName DataStructure
 * @Description: TODO
 * @date ${DAT}9:33
 */
public class LeetCode80 {
    /*
    我们需要在遍历数组元素的同时删除多余的重复项，那么我们需要在删除多余重复项的同时更新数组的索引，否则将访问到无效的元素或跳过需要访问的元素。
我们使用两个变量，i 是遍历数组的指针，count 是记录当前数字出现的次数。count 的最小计数始终为 1。
我们从索引 1 开始一次处理一个数组元素。
若当前元素与前一个元素相同，即 nums[i]==nums[i-1]，则增加计数 count++。若 count > 2，则说明遇到了多余的重复元素 ，要从数组中删除它。由于我们知道这个元素的索引，可以使用 del，pop 或 remove 操作（或你选择语言支持的任何相应的操作）从数组中删除它。由于删除了一个元素，所以我们的索引应该要减一。
若当前元素与前一个元素不相同，即 nums[i] != nums[i - 1]，说明我们遇到了一个新元素，则更新 count = 1。
由于我们从原始数组中删除了所有多余的重复项，所以最终在原数组只保留了有效元素，返回数组长度。
    时间复杂度为On2

     */
    public int[] remElement(int[] arr, int index) {
        for (int i = index + 1; i < arr.length; i++){
            arr[i-1] = arr[i];
        }
        return arr;
    }

    public int removeDuplicates(int[] nums) {
        int i = 1;
        int count = 1;
        int length = nums.length;

        while (i < length){
            if (nums[i] == nums[i - 1]){//如果相同计数
                count++;

                if (count > 2){
                    remElement(nums,i);//进行数组的删除，类似ArrayList的删除 动态数组的解法
                    i--;
                    length--;
                }
            }else {
                count = 1;
            }
            i++;
        }
        return length;
    }

    /**
     * 方法二：覆盖多余的重复项
     * 算法：
     *
     * 我们使用了两个指针，i 是遍历指针，指向当前遍历的元素；j 指向下一个要覆盖元素的位置。
     * 同样，我们用 count 记录当前数字出现的次数。count 的最小计数始终为 1。
     * 我们从索引 1 开始一次处理一个数组元素。
     * 若当前元素与前一个元素相同，即 nums[i]==nums[i-1]，则 count++。若 count > 2，则说明遇到了多余的重复项。在这种情况下，我们只向前移动 i，而 j 不动。
     * 若 count <=2，则我们将 i 所指向的元素移动到 j 位置，并同时增加 i 和 j。
     * 若当前元素与前一个元素不相同，即 nums[i] != nums[i - 1]，说明遇到了新元素，则我们更新 count = 1，并且将该元素移动到 j 位置，并同时增加 i 和 j。
     * 当数组遍历完成，则返回 j。
     *时间复杂度 O（N）
     */
    public int removeDuplicates2(int[] nums) {
        int j = 1;
        int count = 1;
        for (int i = 1; i < nums.length; i++){
            if (nums[i] == nums[i - 1]){
                count++;
            }else {
                count = 1;
            }

            if (count <= 2){
                nums[j++] = nums[i];
            }
        }
        return j;
    }


    public static void main(String[] args) {
        int[] arr = {1,1,1,2,2,3};
        System.out.println(new LeetCode80().removeDuplicates2(arr));
    }
}
